package com.example.salesystem.controller;


import com.example.salesystem.common.ResultAjax;
import com.example.salesystem.common.SessionUtils;
import com.example.salesystem.model.Order;
import com.example.salesystem.model.Product;
import com.example.salesystem.model.User;
import com.example.salesystem.service.IOrderService;
import com.example.salesystem.service.IProductService;
import com.sun.istack.internal.NotNull;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author lishuo
 * @since 2024-05-18
 */
@Api(tags = "订单/购物车接口")
@Slf4j
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private IOrderService orderService;

    @Autowired
    private IProductService productService;

    /**
     * 加入购物车
     * @param request
     * @param id
     * @return
     */
    @ApiOperation("加入购物车")
    @PostMapping("/addShoppingCar")
    public ResultAjax addShoppingCar(HttpServletRequest request,
                                     @ApiParam("商品id") @RequestParam("id") @NotNull String id) {
        // 1. 根据商品 id 查询商品是否存在
        Product product = productService.getById(id);
        if (product == null) {
            // 打印日志
            log.warn("商品不存在");
            // 返回错信息
            return ResultAjax.fail("商品不存在");
        }
        // 2. 获取当前用户信息
        User user = SessionUtils.getUser(request);
        // 3. 封装订单信息
        Order shoppingCarOrder = new Order();
        shoppingCarOrder.setOrderStatus(0); // 购物车状态（0 未结算）
        shoppingCarOrder.setProductQuantity(1); // 目前只支持单个下单
        shoppingCarOrder.setOrderAmount(product.getPrice()); // 订单价格 (当前直接表示单个商品价格)
        shoppingCarOrder.setProductId(product.getId()); // 商品 id
        shoppingCarOrder.setUserId(user.getId()); // 用户 id
        shoppingCarOrder.setCreateTime(LocalDateTime.now()); // 下单时间
        shoppingCarOrder.setUpdateTime(LocalDateTime.now()); // 订单更新时间
        // 4. 调用 service 生成一条购物车订单
        orderService.save(shoppingCarOrder);
        // 5. 返回结果
        return ResultAjax.succ();
    }

    /**
     * 删除订单/移除购物车
     * @param request
     * @param id
     * @return
     */
    @ApiOperation("删除订单/移除购物车")
    @PostMapping("/delOrder")
    public ResultAjax delOrder(HttpServletRequest request,
                               @ApiParam("订单id") @RequestParam("id") @NotNull String id) {
        // 1. 根据订单 Id 查询订单是否存在
        Order order = orderService.getById(id);
        if (order == null) {
            // 打印日志
            log.warn("订单不存在");
            // 返回错信息
            return ResultAjax.fail("订单不存在");
        }
        // 2. 获取当前用户
        User user = SessionUtils.getUser(request);
        // 3. 判断当前订单是否属于当前用户
        if (!order.getUserId().equals(user.getId())) {
            // 打印日志
            log.warn("无权限");
            // 返回错信息
            return ResultAjax.fail("无权限");
        }
        // 4. 调用 service 删除订单
        orderService.removeById(order);
        // 5. 返回结果
        return ResultAjax.succ();
    }

    /**
     * 购物车商品结算/直接购买
     * @param request
     * @param
     * @return
     */
    @ApiOperation("购物车商品结算/直接购买")
    @PostMapping("/settlement")
    public ResultAjax settlement(HttpServletRequest request,
                                 @ApiParam("商品id") @RequestParam(value = "productId",required = false) String productId,
                                 @ApiParam("订单id") @RequestParam(value = "orderId", required = false)  String orderId) {
        // 1. 参数校验
        if ((productId == null && orderId == null) || (productId != null && orderId != null)) {
            // 打印日志
            log.warn("参数校验失败");
            // 返回错信息
            return ResultAjax.fail("参数校验失败");
        }
        // 2. 获取当前用户
        User user = SessionUtils.getUser(request);
        // 3. 分情况
        if (productId != null) {
            // 直接购买
            // (1) 根据商品 id 查询商品
            Product product = productService.getById(productId);
            if (product == null) {
                // 打印日志
                log.warn("商品不存在");
                // 返回错信息
                return ResultAjax.fail("商品不存在");
            }
            // (2) 封装订单信息
            Order shoppingCarOrder = new Order();
            shoppingCarOrder.setOrderStatus(1); // 结算状态（1 已结算）
            shoppingCarOrder.setProductQuantity(1); // 目前只支持单个下单
            shoppingCarOrder.setOrderAmount(product.getPrice()); // 订单价格 (当前直接表示单个商品价格)
            shoppingCarOrder.setProductId(product.getId()); // 商品 id
            shoppingCarOrder.setUserId(user.getId()); // 用户 id
            shoppingCarOrder.setCreateTime(LocalDateTime.now()); // 下单时间
            shoppingCarOrder.setUpdateTime(LocalDateTime.now()); // 订单更新时间
            // 4. 调用 service 生成一条购物车订单
            orderService.save(shoppingCarOrder);
        } else {
            // 购物车结算
            // (1) 根据订单 Id 查询订单是否存在
            Order order = orderService.getById(orderId);
            if (order == null) {
                // 如果订单不存在，为直接购买情况

                // 打印日志
                log.warn("订单不存在");
                // 返回错信息
                return ResultAjax.fail("订单不存在");
            }
            // (2) 判断当前订单是否属于当前用户
            if (!order.getUserId().equals(user.getId())) {
                // 打印日志
                log.warn("无权限");
                // 返回错信息
                return ResultAjax.fail("无权限");
            }
            // (3) 判断当前订单是否处于未结算状态
            if (order.getOrderStatus() != 0) {
                // 打印日志
                log.warn("订单状态异常");
                // 返回错信息
                return ResultAjax.fail("订单状态异常");
            }
            // (4) 调用 service 更新订单状态为已结算
            orderService.lambdaUpdate()
                    .set(Order::getOrderStatus,1)
                    .eq(Order::getId,order.getId()).update();
        }

        // 4. 返回结果
        return ResultAjax.succ();
    }

    /**
     * 获取购物车订单
     * @param request
     * @return
     */
    @ApiOperation("获取购物车订单")
    @GetMapping("/getShoppingCarOrders")
    public ResultAjax<List<Order>> getShoppingCarOrders (HttpServletRequest request) {
        // 1. 获取当前用户
        User user = SessionUtils.getUser(request);
        // 2. 调用 service 获取当前用户下所有购物车订单
        List<Order> orders = orderService.getCars(user.getId());
//        List<Order> orders = orderService.lambdaQuery()
//                .eq(Order::getUserId, user.getId())
//                .eq(Order::getOrderStatus, 0)
//                .orderBy(true,false,Order::getCreateTime)
//                .list();
        // 3. 返回结果
        return ResultAjax.succ(orders);
    }

    /**
     * 获取已结算订单
     * @param request
     * @return
     */
    @ApiOperation("获取已结算订单")
    @GetMapping("/getSettlementOrders")
    public ResultAjax<List<Order>> getSettlementOrders (HttpServletRequest request) {
        // 1. 获取当前用户
        User user = SessionUtils.getUser(request);
        // 2. 调用 service 获取当前用户下所有购物车订单
        List<Order> orders = orderService.getOrders(user.getId());
//        List<Order> orders = orderService.lambdaQuery()
//                .eq(Order::getUserId, user.getId())
//                .eq(Order::getOrderStatus, 1)
//                .list();
        // 3. 返回结果
        return ResultAjax.succ(orders);
    }
}
